`timescale 1ns/1ps
`default_nettype none
// -----------------------------------------------------------------------------
// imm_gen.v —— 立即数生成（I / S / J / B）
//   imm_i: I型（ADDI/LW/JALR 等）
//   imm_s: S型（SW）
//   imm_j: J型（JAL），已经 <<1
//   imm_b: B型（BEQ/BNE/...），已经 <<1
// -----------------------------------------------------------------------------
module imm_gen(
    input  wire [31:0] instr,
    output wire [31:0] imm_i,   // I-type: 31:20
    output wire [31:0] imm_s,   // S-type: 31:25|11:7
    output wire [31:0] imm_j,    // J-type: 31|19:12|20|30:21, <<1
    output wire [31:0] imm_b
);
    // I-type: imm[11:0] = instr[31:20]
    assign imm_i = {{20{instr[31]}}, instr[31:20]};

    // S: 31:25|11:7
    wire [11:0] imm_s_12 = {instr[31:25], instr[11:7]};
    assign imm_s = {{20{imm_s_12[11]}}, imm_s_12};

    // J: 31|19:12|20|30:21|0
    wire [20:0] j = { instr[31], instr[19:12], instr[20], instr[30:21], 1'b0 };
    assign imm_j = {{11{j[20]}}, j}; // 符号扩展到 32 位

    // B: 12|10:5|4:1|11|0
    wire [12:0] b = { instr[31], instr[7], instr[30:25], instr[11:8], 1'b0 };
    assign imm_b = {{19{b[12]}}, b};
endmodule
